/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import model.bean.BeanArchivo;
import model.bean.BeanCurso;
import model.bean.BeanEstado;
import model.bean.BeanPrivilegio;
import model.bean.BeanTipoArchivo;
import model.bean.BeanUsuario;
import model.daobase.DBase;

/**
 *
 * @author francotel
 */
public class DaoUsuario extends DBase {

    // para poder autenticar al usuario registrado (moderador y/o administrador)
    public int autentica(String correo, String clave) {

        this.init_mysql(); // inicializamos la conexion
        PreparedStatement pstmt = null; // preparamos la sentencia
        ResultSet res = null; // variable res que guardara los resultados obtenidos
        int iduser = 0; // id para poder manejar los id de usuarios

        try {

            // creamos el query : select idusuario from usuario where (correo like "francotel@pucp.pe" and clave like md5("1234"));
            String query =
                    "SELECT idusuario "
                    + "FROM usuario "
                    + "WHERE (correo LIKE '" + correo + "') "
                    + "AND (clave LIKE md5('" + clave + "'))";

            pstmt = conn.prepareStatement(query);// conectamos la sentencia a base de datos incluido con el query
            res = pstmt.executeQuery(); // se ejecuta el query guardandose los resultados en res

            while (res.next()) {

                iduser = res.getInt(1); // en este caso solo habra un resultado puesto un correo y clave solo pertenece a un usuario
                //y guardamos el resultado en iduser

            }

            res.close();
            pstmt.close();
            conn.close();
        } catch (SQLException e1) {

            e1.getMessage();
        }

        return iduser;
    }

    // Inicializar al BeanUsuario luego de obtenido el iduser
    // puesto que este me indica si es un administrador,moderador o usuario
    // de acuerdo a ello ,es decir, al privilegio y estado se puede obtener sus datos
    public ArrayList<BeanUsuario> getUserList() {
        ArrayList<BeanUsuario> UserList = new ArrayList<BeanUsuario>();
        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        BeanUsuario usuario = null;

        try {

            String query = "select * FROM usuario u INNER JOIN privilegio p ON p.idprivilegio=u.idprivilegio"
                    + " INNER JOIN estado e ON u.idestado=e.idestado WHERE u.idprivilegio=0 AND u.idestado!=-1";

            pstmt = conn.prepareStatement(query);
            res = pstmt.executeQuery();
            while (res.next()) {
                usuario = new BeanUsuario();
                usuario.setIdusuario(res.getInt("idusuario"));
                usuario.setNombre(res.getString("nombre"));
                usuario.setApellido(res.getString("apellido"));
                usuario.setAlias(res.getString("alias"));
                usuario.setCorreo(res.getString("correo"));
                usuario.setFecha_registro(res.getDate("fecha_registro"));
                BeanPrivilegio privilegio = new BeanPrivilegio();
                privilegio.setIdprivilegio(res.getInt("idprivilegio"));
                privilegio.setNombre_privilegio(res.getString("nombre_privilegio"));
                usuario.setPrivilegio(privilegio);
                BeanEstado estado = new BeanEstado();
                estado.setIdestado(res.getInt("idestado"));
                estado.setNombre_estado(res.getString("nombre_estado"));
                usuario.setEstado(estado);
                usuario.setFecha_cambio_estado(res.getDate("fecha_cambio_estado"));

                UserList.add(usuario);
            }



            res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

        return UserList;

    }

    public BeanUsuario get(Integer idusuario) {

        this.init_mysql(); // inicializamos la conexion
        PreparedStatement pstmt = null; // preparamos la sentencia
        ResultSet res = null; // variable res que guardara los resultados obtenidos
        BeanUsuario usuario = new BeanUsuario(); // creamos al objeto usuario del BeanUsuario

        try {

            // query que selecciona todos los datos del usuario a partir de su idusuario  
            String query = "select * FROM usuario u INNER JOIN privilegio p ON p.idprivilegio=u.idprivilegio"
                    + " INNER JOIN estado e ON u.idestado=e.idestado"
                    + " WHERE u.idusuario=" + idusuario;

            pstmt = conn.prepareStatement(query);
            res = pstmt.executeQuery();

            while (res.next()) {

                usuario.setIdusuario(res.getInt("idusuario"));
                usuario.setNombre(res.getString("nombre"));
                usuario.setApellido(res.getString("apellido"));
                usuario.setAlias(res.getString("alias"));
                usuario.setCorreo(res.getString("correo"));
                usuario.setFecha_registro(res.getDate("fecha_registro"));

                //como el privilegio es un bean aparte se debe crear un objeto de este y almacenarlo en el
                BeanPrivilegio privilegio = new BeanPrivilegio();
                privilegio.setIdprivilegio(res.getInt("idprivilegio"));
                privilegio.setNombre_privilegio(res.getString("nombre_privilegio"));
                usuario.setPrivilegio(privilegio);

                //como el estado es un bean aparte se debe crear un objeto de este y almacenarlo en el
                BeanEstado estado = new BeanEstado();
                estado.setIdestado(res.getInt("idestado"));
                estado.setNombre_estado(res.getString("nombre_estado"));
                usuario.setEstado(estado);

                usuario.setRuta_foto(res.getString("ruta_foto"));
                usuario.setFecha_cambio_estado(res.getDate("fecha_cambio_estado"));
            }

            res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }
        return usuario;

    }

    // metodo para validar al nuevo usuario 
    public String validausuario(BeanUsuario usuario, String clavetemp) {
        String aviso = "";

        DaoUsuario daousuario = new DaoUsuario();

        BeanEstado estado = new BeanEstado();
        BeanPrivilegio privilegio = new BeanPrivilegio();

        int idusuario = daousuario.validacorreo(usuario.getCorreo());
        int iduser = daousuario.validaalias(usuario.getAlias());
        boolean alfanumerico = daousuario.valida_caracter_alias(usuario.getAlias());
        boolean correo_valido = daousuario.valida_dominio_pucp(usuario.getCorreo());
        boolean nombre_valido = daousuario.valida_palabra(usuario.getNombre());
        boolean apellido_valido = daousuario.valida_palabra(usuario.getApellido());
//     boolean start_upcase = daousuario.mayuscula(usuario.getNombre());
//     boolean start_upcase2 = daousuario.mayuscula(usuario.getApellido());
//     
        if (usuario.getNombre().isEmpty()) {
            aviso = "Ingrese su nombre";
        } else {
            if ((nombre_valido)) {

                if ((usuario.getNombre().length() > 1) && (usuario.getNombre().length() < 30)) {

                    if (usuario.getApellido().isEmpty()) {
                        aviso = "Ingrese su apellido " + "\n" + nombre_valido + " ";
                    } else {
                        if (apellido_valido) {
                            if ((usuario.getNombre().length() > 1) && (usuario.getNombre().length() < 30)) {

                                if (usuario.getAlias().isEmpty()) {
                                    aviso = "Nombre de Usuario no debe ser vacio";
                                } else {
                                    if (alfanumerico) {

                                        if ((usuario.getAlias().length() > 1) && (usuario.getAlias().length() < 15)) {
                                            if (iduser == 0) {
                                                if (usuario.getCorreo().isEmpty()) {
                                                    aviso = "Correo no debe ser vacio";
                                                } else {
                                                    if (correo_valido) {
                                                        if (idusuario == 0) {
                                                            if (usuario.getClave().isEmpty()) {
                                                                aviso = "ingrese una contraseña";
                                                            } else {
                                                                if (usuario.getClave().length() > 5) {
                                                                    if (usuario.getClave().equals(clavetemp)) {

                                                                        privilegio.setIdprivilegio(0);
                                                                        usuario.setPrivilegio(privilegio);

                                                                        estado.setIdestado(1);
                                                                        usuario.setEstado(estado);

                                                                        usuario.setRuta_foto(null);
                                                                        usuario.setFecha_cambio_estado(null);

                                                                    } else {
                                                                        aviso = "Las contraseñas no coinciden";
                                                                    }

                                                                } else {
                                                                    aviso = "debe tener una longitud mayor a 5";
                                                                }

                                                            }


                                                        } else {
                                                            aviso = "Correo ya registrado!";
                                                        }

                                                    } else {
                                                        aviso = "el correo debe ser @pucp.edu.pe o @pucp.pe";
                                                    }

                                                }

                                            } else {
                                                aviso = "Usuario ya existe";
                                            }
                                        } else {
                                            aviso = "alias desbe tener mas de 2 y menos de 15\"";
                                        }
                                    } else {
                                        aviso = "Deben ser caracteres alfanumerico";
                                    }
                                }
                            } else {
                                aviso = "Nombre desbe tener mas de 2 y menos de 30";
                            }



                        } else {
                            aviso = "Ingrese un apellido valido y que empieze con mayuscula" + "\n";

                        }

                    }
                } else {
                    aviso = "Nombre desbe tener mas de 2 y menos de 30";
                }
            } else {

                aviso = "Ingrese un nombre valido y que empieze con Mayusucla";
            }
        }
        return aviso;
    }

    // validamos en el usuario si su correo es pucp
    public int validacorreo(String correo) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        int iduser = 0;
        try {
            String query =
                    "SELECT idusuario "
                    + "FROM usuario "
                    + "WHERE (correo LIKE '" + correo + "') ";
            pstmt = conn.prepareStatement(query);
            res = pstmt.executeQuery();

            while (res.next()) {
                iduser = res.getInt(1);
            }

            res.close();
            pstmt.close();
            conn.close();
        } catch (SQLException e1) {
            e1.getMessage();
        }
        return iduser;
    }

    // valida el alias del usuario que recien se registra
    public int validaalias(String alias) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        int iduser = 0;
        try {
            String query =
                    "SELECT idusuario "
                    + "FROM usuario "
                    + "WHERE (alias LIKE '" + alias + "') ";

            pstmt = conn.prepareStatement(query);
            res = pstmt.executeQuery();
            while (res.next()) {
                iduser = res.getInt(1);
            }

            res.close();
            pstmt.close();
            conn.close();
        } catch (SQLException e1) {
            e1.getMessage();
        }
        return iduser;
    }

    // valida que los caracteres de alias sean correctos
    public boolean valida_caracter_alias(String temp) {

        Boolean valor = false;
//        if (temp.matches("[^a-z_A-Z_0-9]")){
        for (int i = 0; i < temp.length(); i++) {
            if ((temp.charAt(i) > 64 && temp.charAt(i) < 91) || (temp.charAt(i) > 96 && temp.charAt(i) < 123) || (temp.charAt(i) > 47 && temp.charAt(i) < 58)) {
                valor = true;
            } else {
                valor = false;
            }
        }
        return valor;
    }

    // valida las palabras ingresadas
    public boolean valida_palabra(String temp) {
        boolean aux = false;

        for (int i = 0; i < temp.length(); i++) {
            if ((temp.charAt(i) > 64 && temp.charAt(i) < 91) || (temp.charAt(i) > 96 && temp.charAt(i) < 123)) {


                aux = true;

            } else {
                aux = false;
            }
        }
        return aux;
    }

    // valida el dominio del correo
    public boolean valida_dominio_pucp(String temp) {

        Boolean valor = false;

        if ((temp.matches(".+@pucp.pe")) || (temp.matches(".+@pucp.edu.pe"))) {
//        if (temp.matches("[0-9a-zA-Z]([.w][0-9a-zA-Z])+@pucp.pe") || temp.matches("[0-9a-zA-Z]([.w][0-9a-zA-Z])+@pucp.edu.pe")) {
            valor = true;
        } else {
            valor = false;
        }
        return valor;
    }

    public void insert(BeanUsuario usuario) {
        this.init_mysql();
        PreparedStatement pstmt = null;



        try {

            String query = " INSERT INTO usuario(nombre,apellido,alias,correo,clave,fecha_registro,idprivilegio,idestado,ruta_foto,fecha_cambio_estado) "
                    + "VALUES(?,?,?,?,md5(?),now(),?,?,?,?)";


            pstmt = conn.prepareStatement(query);

            pstmt.setString(1, usuario.getNombre());
            pstmt.setString(2, usuario.getApellido());
            pstmt.setString(3, usuario.getAlias());
            pstmt.setString(4, usuario.getCorreo());
            pstmt.setString(5, usuario.getClave());
            pstmt.setInt(6, 0);
            pstmt.setInt(7, 1);
            pstmt.setString(8, usuario.getRuta_foto());
            pstmt.setDate(9, null);

            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }


    }

    // query que despues de validar al usuario nuevo lo registra
    public void registro(BeanUsuario usuario) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        String rutafoto = "/usuarios/user.jpg";
//BeanUsuario usuario= new BeanUsuario();
        try {
            String query = "INSERT INTO usuario(nombre, apellido, alias, correo, clave, idprivilegio, idestado, ruta_foto, fecha_cambio_estado)"
                    + " VALUES('" + usuario.getNombre() + "','" + usuario.getApellido() + "','" + usuario.getAlias() + "','" + usuario.getCorreo() + "',md5('" + usuario.getClave() + "'),"
                    + " '" + usuario.getPrivilegio().getIdprivilegio() + "','" + usuario.getEstado().getIdestado() + "'," + rutafoto + "," + usuario.getFecha_cambio_estado() + ");";

            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }
//    return usuario;
    }

    // subir foto
    public void update_foto(BeanUsuario usuario) {
        this.init_mysql();
        PreparedStatement pstmt = null;
        try {

            String query = "UPDATE usuario SET ruta_foto = ? WHERE idusuario=" + usuario.getIdusuario();
            pstmt = conn.prepareStatement(query);
            pstmt.setString(1, usuario.getRuta_foto());
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }
    }

    public String retornarutamd5(BeanUsuario usuario) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        String rutamd5 = "";
        try {
            String query = "select ruta_foto from usuario where nombre=?";
            pstmt = conn.prepareStatement(query);
            pstmt.setString(1, usuario.getNombre());
            res = pstmt.executeQuery();

            while (res.next()) {
                rutamd5 = res.getString(1);
            }

            res.close();
            pstmt.close();
            conn.close();
        } catch (SQLException e1) {
            e1.getMessage();
        }
        return rutamd5;
    }

    public void delete(Integer idusuario) {

        this.init_mysql();
        PreparedStatement pstmt = null;


        try {

            String query = "DELETE FROM usuario WHERE idusuario=" + idusuario;
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

    }

    public void update_data(BeanUsuario usuario) {
        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;

        try {

            String query = "UPDATE usuario SET nombre='" + usuario.getNombre() + "', apellido='" + usuario.getApellido() + "', alias='" + usuario.getAlias()
                    + "', correo='" + usuario.getCorreo() + "' WHERE idusuario=" + usuario.getIdusuario();
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }
    }

    public void update_password(BeanUsuario usuario) {
        this.init_mysql();
        PreparedStatement pstmt = null;


        try {

            String query = "UPDATE usuario SET clave=md5('" + usuario.getClave() + "') WHERE idusuario=" + usuario.getIdusuario();
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }
    }

    public void block(Integer idusuario) {
        this.init_mysql();
        PreparedStatement pstmt = null;


        try {

            String query = "UPDATE usuario SET idestado=0, fecha_cambio_estado=now() WHERE idusuario=" + idusuario;
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

    }

    public boolean valida_password(BeanUsuario usuario, String pass) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;

        int iduser = 0;

        try {
            String query =
                    "SELECT idusuario "
                    + "FROM usuario "
                    + "WHERE (clave LIKE md5(?) AND idusuario = ? )";



            pstmt = conn.prepareStatement(query);

            pstmt.setString(1, pass);
            pstmt.setInt(2, usuario.getIdusuario());
            res = pstmt.executeQuery();
            while (res.next()) {
                iduser = res.getInt(1);
            }
            res.close();
            pstmt.close();
            conn.close();
        } catch (SQLException e1) {
            e1.getMessage();
        }
        return iduser > 0;
    }

    public void unblock(Integer idusuario) {
        this.init_mysql();
        PreparedStatement pstmt = null;

        try {
            String query = "UPDATE usuario SET idestado=1, fecha_cambio_estado=now() WHERE idusuario=" + idusuario;
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

    }

    public void nombra_moderador(Integer idusuario) {
        this.init_mysql();
        PreparedStatement pstmt = null;


        try {

            String query = "UPDATE usuario SET idprivilegio=1 WHERE idusuario=" + idusuario;
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

    }

    public void desnombra_moderador(Integer idusuario) {
        this.init_mysql();
        PreparedStatement pstmt = null;


        try {

            String query = "UPDATE usuario SET idprivilegio=0 WHERE idusuario=" + idusuario;
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

    }

    public void update_nick(int idusuario, String alias) {
        this.init_mysql();
        PreparedStatement pstmt = null;


        try {

            String query = "UPDATE usuario SET alias='" + alias + "' WHERE idusuario=" + idusuario;
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }
    }

    public boolean mayuscula(String temp) {
        Boolean valor = true;

        String s = temp;

        String p = s.substring(0, 1);
        if (s.startsWith(p.toLowerCase())) {
            valor = false;
        } else {
            valor = true;
        }

        return valor;
    }

    public ArrayList<BeanArchivo> ArchivolistUser() {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        ArrayList<BeanArchivo> lista_archivos = new ArrayList<BeanArchivo>();


        try {

            String query = "SELECT a.idarchivo,a.semestre,a.nota,a.megusta,a.num_descargas,u.idusuario,cu.nombre_curso,a.ruta,a.descripcion,a.fecha_subida,a.tamaño,e.nombre_estado,ta.idtipoarchivo "
                    + "FROM archivo a "
                    + "INNER JOIN curso cu ON cu.idcurso = a.idcurso "
                    + "INNER JOIN estado e ON e.idestado = a.idestado "
                    + "INNER JOIN usuario u ON u.idusuario = a.idusuario"
                    + "INNER JOIN tipoarchivo ta ON ta.idtipoarchivo = a.idtipoarchivo"
                    + "ORDER BY cu.nombre_curso";

            pstmt = conn.prepareStatement(query);
            res = pstmt.executeQuery();

            BeanArchivo archivo;
            while (res.next()) {
                archivo = new BeanArchivo();
                archivo.setIdarchivo(res.getInt(1));
                archivo.setSemestre(res.getString(2));
                archivo.setNota(res.getInt(3));
                archivo.setMegusta(res.getInt(4));
                archivo.setNum_descargas(res.getInt(5));

                BeanUsuario usuario = new BeanUsuario();
                usuario.setIdusuario(res.getInt(6));
                archivo.setUsuario(usuario);

                BeanCurso curso = new BeanCurso();
                curso.setNombre_curso(res.getString(7));
                archivo.setCurso(curso);

                archivo.setRuta(res.getString(8));
                archivo.setDescripcion(res.getString(9));
                archivo.setFecha_subida(res.getDate(10));
                archivo.setTamaño(res.getDouble(11));

                BeanEstado estado = new BeanEstado();
                estado.setNombre_estado(res.getString(12));
                archivo.setEstado(estado);

                BeanTipoArchivo tipoarchivo = new BeanTipoArchivo();
                tipoarchivo.setIdtipoarchivo(res.getInt(13));
                archivo.setTipoarchivo(tipoarchivo);

                lista_archivos.add(archivo);
            }

            res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

        return lista_archivos;

    }

    public BeanUsuario ValidarCorreo(String correo) {

        BeanUsuario usuario = null;
        this.init_mysql();
        PreparedStatement pst = null;
        ResultSet rs = null;
        try {
            String query = "select u.clave, u.correo from usuario u "
                    + "where u.correo = ?";

            pst = conn.prepareStatement(query);
            pst.setString(1, correo);
            rs = pst.executeQuery();
            while (rs.next()) {

                usuario = new BeanUsuario();
                usuario.setClave(rs.getString(1));
                usuario.setCorreo(rs.getString(2));
            }
            rs.close();
            pst.close();
            conn.close();

        } catch (SQLException ex) {
            System.err.println("Error al ejecutar el query");
            ex.printStackTrace();
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException ex) {
                    ;
                }
                rs = null;
            }
            if (pst != null) {
                try {
                    pst.close();
                } catch (SQLException ex) {
                    ;
                }
                pst = null;
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    ;
                }
                conn = null;
            }
        }
        return usuario;
    }

    public void setToken(String token, String correo) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        try {


            String query = "Update usuario Set token=? where correo=?;";

            pstmt = conn.prepareStatement(query);
            pstmt.setString(1, token);
            pstmt.setString(2, correo);

            pstmt.executeUpdate();
            pstmt.close();
            conn.close();
        } catch (SQLException ex) {
            System.out.println("no se pudo xD");
        } finally {
            if (pstmt != null) {
                try {
                    pstmt.close();
                } catch (SQLException ex) {
                    ;
                }
                pstmt = null;
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    ;
                }
                conn = null;
            }
        }

    }

    public void cambiarContrasenia(int idusuario, String contrasenia) {

        this.init_mysql();
        PreparedStatement pst = null;
        ResultSet rs = null;
        try {
            //String query = "update usuario set contrasena = AES_ENCRYPT(?,'llave') where idusuario = ?;";
            String query = "update usuario set clave = MD5(?) where idusuario = ?;";

            pst = conn.prepareStatement(query);
            pst.setString(1, contrasenia);
            pst.setInt(2, idusuario);
            pst.executeUpdate();
            //while (rs.next()) {                
            //  usuario = new BUsuario();
            //  usuario.setContrasena(rs.getString(1));
            //  usuario.setCorreo(rs.getString(2));

            //}
            pst.close();

            conn.close();
        } catch (SQLException ex) {
            System.err.println("Error al ejecutar el query");
            ex.printStackTrace();
        } finally {
            if (pst != null) {
                try {
                    pst.close();
                } catch (SQLException ex) {
                    ;
                }
                pst = null;
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    ;
                }
                conn = null;
            }
        }
        //return usuario;
    }

    public void cambiarContraseña(int idusuario, String contraseña) {


        this.init_mysql();
        PreparedStatement pst = null;
        ResultSet rs = null;
        try {
//            String query = "update usuario set contrasena = AES_ENCRYPT(?,'llave') where idusuario = ?;";
            String query = "update usuario set clave = MD5(?) where idusuario = ?;";

            pst = conn.prepareStatement(query);
            pst.setString(1, contraseña);
            pst.setInt(2, idusuario);
            pst.executeUpdate();
            //while (rs.next()) {                
            //  usuario = new BUsuario();
            //  usuario.setContrasena(rs.getString(1));
            //  usuario.setCorreo(rs.getString(2));

            //}
            pst.close();

            conn.close();
        } catch (SQLException ex) {
            System.err.println("Error al ejecutar el query");
            ex.printStackTrace();
        } finally {
            if (pst != null) {
                try {
                    pst.close();
                } catch (SQLException ex) {
                    ;
                }
                pst = null;
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    ;
                }
                conn = null;
            }
        }
        //return usuario;
    }

    public ArrayList<BeanUsuario> getByString(String cadena, String fecha_registro1, String fecha_registro2) {
        ArrayList<BeanUsuario> userList = new ArrayList<BeanUsuario>();
        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        BeanUsuario usuario = null;


        try {
            if (cadena != "" && fecha_registro1 != "" && fecha_registro2 != "") {
                String temporal = "%" + cadena + "%";
                String[] fecha_1 = fecha_registro1.split("-");
                String[] fecha_2 = fecha_registro2.split("-");
                String fecha_reg1 = fecha_1[0] + "," + fecha_1[1] + "," + fecha_1[2];
                String fecha_reg2 = fecha_2[0] + "," + fecha_2[1] + "," + fecha_2[2];





                String query = "select * FROM usuario u INNER JOIN privilegio p ON p.idprivilegio=u.idprivilegio"
                        + " INNER JOIN estado e ON u.idestado=e.idestado WHERE u.idprivilegio=0 AND (u.idestado=0 OR u.idestado=1) AND"
                        + " (u.nombre LIKE ? OR u.apellido LIKE ? OR u.alias LIKE ? OR (DATE(fecha_registro)>=str_to_date(?,'%Y,%m,%d') AND DATE(fecha_registro)<=str_to_date(?,'%Y,%m,%d')))";

                pstmt = conn.prepareStatement(query);
                pstmt.setString(1, temporal);
                pstmt.setString(2, temporal);
                pstmt.setString(3, temporal);
                pstmt.setString(4, fecha_reg1);
                pstmt.setString(5, fecha_reg2);
            } else if (cadena == "" && fecha_registro1 != "" && fecha_registro2 != "") {
                String[] fecha_1 = fecha_registro1.split("-");
                String[] fecha_2 = fecha_registro2.split("-");
                String fecha_reg1 = fecha_1[0] + "," + fecha_1[1] + "," + fecha_1[2];
                String fecha_reg2 = fecha_2[0] + "," + fecha_2[1] + "," + fecha_2[2];

                String query = "select * FROM usuario u INNER JOIN privilegio p ON p.idprivilegio=u.idprivilegio"
                        + " INNER JOIN estado e ON u.idestado=e.idestado WHERE u.idprivilegio=0 AND (u.idestado=0 OR u.idestado=1) AND"
                        + " (DATE(fecha_registro)>=str_to_date(?,'%Y,%m,%d') AND DATE(fecha_registro)<=str_to_date(?,'%Y,%m,%d'))";
                pstmt = conn.prepareStatement(query);
                pstmt.setString(1, fecha_reg1);
                pstmt.setString(2, fecha_reg2);

            } else if (cadena != "" && fecha_registro1 == "" && fecha_registro2 == "") {
                String temporal = "%" + cadena + "%";
                String query = "select * FROM usuario u INNER JOIN privilegio p ON p.idprivilegio=u.idprivilegio"
                        + " INNER JOIN estado e ON u.idestado=e.idestado WHERE u.idprivilegio=0 AND (u.idestado=0 OR u.idestado=1) AND"
                        + " (u.nombre LIKE ? OR u.apellido LIKE ? OR u.alias LIKE ?)";
                pstmt = conn.prepareStatement(query);
                pstmt.setString(1, temporal);
                pstmt.setString(2, temporal);
                pstmt.setString(3, temporal);
            }


            res = pstmt.executeQuery();
            while (res.next()) {
                usuario = new BeanUsuario();
                usuario.setIdusuario(res.getInt("idusuario"));
                usuario.setNombre(res.getString("nombre"));
                usuario.setApellido(res.getString("apellido"));
                usuario.setAlias(res.getString("alias"));
                usuario.setCorreo(res.getString("correo"));
                usuario.setFecha_registro(res.getDate("fecha_registro"));
                BeanPrivilegio privilegio = new BeanPrivilegio();
                privilegio.setIdprivilegio(res.getInt("idprivilegio"));
                privilegio.setNombre_privilegio(res.getString("nombre_privilegio"));
                usuario.setPrivilegio(privilegio);
                BeanEstado estado = new BeanEstado();
                estado.setIdestado(res.getInt("idestado"));
                estado.setNombre_estado(res.getString("nombre_estado"));
                usuario.setEstado(estado);
                usuario.setFecha_cambio_estado(res.getDate("fecha_cambio_estado"));

                userList.add(usuario);
            }



            res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }


        return userList;

    }

    public BeanUsuario usuarioXToken(String token) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet rs;
        BeanUsuario bUsuario = null;
        try {


            String query = "Select usuario, idusuario, correo from usuario u where u.token=?";

            pstmt = conn.prepareStatement(query);
            pstmt.setString(1, token);


            pstmt.executeQuery();
            rs = pstmt.getResultSet();

            while (rs.next()) {
                bUsuario = new BeanUsuario();
                bUsuario.setAlias(rs.getString(1));
                bUsuario.setIdusuario(rs.getInt(2));
                bUsuario.setCorreo(rs.getString(3));

            }
            pstmt.close();
            conn.close();
        } catch (SQLException ex) {
            System.out.println("no se pudo xD");
        } finally {
            if (pstmt != null) {
                try {
                    pstmt.close();
                } catch (SQLException ex) {
                    ;
                }
                pstmt = null;
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    ;
                }
                conn = null;
            }
        }
        return bUsuario;
    }
}
